#pragma once
#include "Input.h"

namespace Reign
{namespace Input
{namespace DI
{
	public ref class Keyboard : Disposable, KeyboardI
	{
		#pragma region Properties
		private: Input^ input;
		private: IDirectInputDevice8* device;
		private: array<Button^>^ button;
		private: char* keys;

		public: virtual Button^ Key(int index);
		public: virtual property Button^ A {Button^ get();}
		public: virtual property Button^ B {Button^ get();}
		public: virtual property Button^ C {Button^ get();}
		public: virtual property Button^ D {Button^ get();}
		public: virtual property Button^ E {Button^ get();}
		public: virtual property Button^ F {Button^ get();}
		public: virtual property Button^ G {Button^ get();}
		public: virtual property Button^ H {Button^ get();}
		public: virtual property Button^ I {Button^ get();}
		public: virtual property Button^ J {Button^ get();}
		public: virtual property Button^ K {Button^ get();}
		public: virtual property Button^ L {Button^ get();}
		public: virtual property Button^ M {Button^ get();}
		public: virtual property Button^ N {Button^ get();}
		public: virtual property Button^ O {Button^ get();}
		public: virtual property Button^ P {Button^ get();}
		public: virtual property Button^ Q {Button^ get();}
		public: virtual property Button^ R {Button^ get();}
		public: virtual property Button^ S {Button^ get();}
		public: virtual property Button^ T {Button^ get();}
		public: virtual property Button^ U {Button^ get();}
		public: virtual property Button^ V {Button^ get();}
		public: virtual property Button^ W {Button^ get();}
		public: virtual property Button^ X {Button^ get();}
		public: virtual property Button^ Y {Button^ get();}
		public: virtual property Button^ Z {Button^ get();}
		public: virtual property Button^ D0 {Button^ get();}
		public: virtual property Button^ D1 {Button^ get();}
		public: virtual property Button^ D2 {Button^ get();}
		public: virtual property Button^ D3 {Button^ get();}
		public: virtual property Button^ D4 {Button^ get();}
		public: virtual property Button^ D5 {Button^ get();}
		public: virtual property Button^ D6 {Button^ get();}
		public: virtual property Button^ D7 {Button^ get();}
		public: virtual property Button^ D8 {Button^ get();}
		public: virtual property Button^ D9 {Button^ get();}
		public: virtual property Button^ F1 {Button^ get();}
		public: virtual property Button^ F2 {Button^ get();}
		public: virtual property Button^ F3 {Button^ get();}
		public: virtual property Button^ F4 {Button^ get();}
		public: virtual property Button^ F5 {Button^ get();}
		public: virtual property Button^ F6 {Button^ get();}
		public: virtual property Button^ F7 {Button^ get();}
		public: virtual property Button^ F8 {Button^ get();}
		public: virtual property Button^ F9 {Button^ get();}
		public: virtual property Button^ F10 {Button^ get();}
		public: virtual property Button^ F11 {Button^ get();}
		public: virtual property Button^ F12 {Button^ get();}
		public: virtual property Button^ F13 {Button^ get();}
		public: virtual property Button^ F14 {Button^ get();}
		public: virtual property Button^ F15 {Button^ get();}
		public: virtual property Button^ ArrowLeft {Button^ get();}
		public: virtual property Button^ ArrowRight {Button^ get();}
		public: virtual property Button^ ArrowDown {Button^ get();}
		public: virtual property Button^ ArrowUp {Button^ get();}
		public: virtual property Button^ Space {Button^ get();}
		public: virtual property Button^ Esc {Button^ get();}
		public: virtual property Button^ Minus {Button^ get();}
		public: virtual property Button^ Equal {Button^ get();}
		public: virtual property Button^ Backspace {Button^ get();}
		public: virtual property Button^ Tab {Button^ get();}
		public: virtual property Button^ BracketLeft {Button^ get();}
		public: virtual property Button^ BracketRight {Button^ get();}
		public: virtual property Button^ Return {Button^ get();}
		public: virtual property Button^ ControlLeft {Button^ get();}
		public: virtual property Button^ ControlRight {Button^ get();}
		public: virtual property Button^ SemiColon {Button^ get();}
		public: virtual property Button^ Apostrophe {Button^ get();}
		public: virtual property Button^ Grave {Button^ get();}
		public: virtual property Button^ ShiftLeft {Button^ get();}
		public: virtual property Button^ ShiftRight {Button^ get();}
		public: virtual property Button^ Comma {Button^ get();}
		public: virtual property Button^ Period {Button^ get();}
		public: virtual property Button^ SlashBack {Button^ get();}
		public: virtual property Button^ SlashForward {Button^ get();}
		public: virtual property Button^ AltLeft {Button^ get();}
		public: virtual property Button^ AltRight {Button^ get();}
		public: virtual property Button^ WindowsKeyLeft {Button^ get();}
		public: virtual property Button^ WindowsKeyRight {Button^ get();}
		public: virtual property Button^ Capital {Button^ get();}
		public: virtual property Button^ NumLock {Button^ get();}
		public: virtual property Button^ Scroll {Button^ get();}
		public: virtual property Button^ Decimal {Button^ get();}
		public: virtual property Button^ OEM_102 {Button^ get();}
		public: virtual property Button^ KANA {Button^ get();}
		public: virtual property Button^ ABNT_C1 {Button^ get();}
		public: virtual property Button^ Convert {Button^ get();}
		public: virtual property Button^ NoConvert {Button^ get();}
		public: virtual property Button^ YEN {Button^ get();}
		public: virtual property Button^ ABNT_C2 {Button^ get();}
		public: virtual property Button^ PrevTrack {Button^ get();}
		public: virtual property Button^ NextTrack {Button^ get();}
		public: virtual property Button^ PlayPause {Button^ get();}
		public: virtual property Button^ Pause {Button^ get();}
		public: virtual property Button^ MediaStop {Button^ get();}
		public: virtual property Button^ MediaSelect {Button^ get();}
		public: virtual property Button^ VolumeDown {Button^ get();}
		public: virtual property Button^ VolumeUp {Button^ get();}
		public: virtual property Button^ Apps {Button^ get();}
		public: virtual property Button^ Power {Button^ get();}
		public: virtual property Button^ Sleep {Button^ get();}
		public: virtual property Button^ Wake {Button^ get();}
		public: virtual property Button^ WebHome {Button^ get();}
		public: virtual property Button^ WebSearch {Button^ get();}
		public: virtual property Button^ WebFavorites {Button^ get();}
		public: virtual property Button^ WebRefresh {Button^ get();}
		public: virtual property Button^ WebStop {Button^ get();}
		public: virtual property Button^ WebForward {Button^ get();}
		public: virtual property Button^ WebBack {Button^ get();}
		public: virtual property Button^ MyComputer {Button^ get();}
		public: virtual property Button^ Mail {Button^ get();}
		public: virtual property Button^ Home {Button^ get();}
		public: virtual property Button^ End {Button^ get();}
		public: virtual property Button^ PageUp {Button^ get();}
		public: virtual property Button^ PageDown {Button^ get();}
		public: virtual property Button^ Insert {Button^ get();}
		public: virtual property Button^ Delete_NOTE_Dispose {Button^ get();}
		public: virtual property Button^ NumPad0 {Button^ get();}
		public: virtual property Button^ NumPad1 {Button^ get();}
		public: virtual property Button^ NumPad2 {Button^ get();}
		public: virtual property Button^ NumPad3 {Button^ get();}
		public: virtual property Button^ NumPad4 {Button^ get();}
		public: virtual property Button^ NumPad5 {Button^ get();}
		public: virtual property Button^ NumPad6 {Button^ get();}
		public: virtual property Button^ NumPad7 {Button^ get();}
		public: virtual property Button^ NumPad8 {Button^ get();}
		public: virtual property Button^ NumPad9 {Button^ get();}
		public: virtual property Button^ NumPadEqual {Button^ get();}
		public: virtual property Button^ NumPadEnter {Button^ get();}
		public: virtual property Button^ NumPadComma {Button^ get();}
		public: virtual property Button^ NumPadDevide {Button^ get();}
		public: virtual property Button^ NumPadSubtract {Button^ get();}
		public: virtual property Button^ NumPadAdd {Button^ get();}
		public: virtual property Button^ NumPadMultiply {Button^ get();}
		public: virtual property Button^ AT {Button^ get();}
		public: virtual property Button^ Colon {Button^ get();}
		public: virtual property Button^ Underline {Button^ get();}
		public: virtual property Button^ KANJI {Button^ get();}
		public: virtual property Button^ Stop {Button^ get();}
		public: virtual property Button^ AX {Button^ get();}
		public: virtual property Button^ Unlabeled {Button^ get();}
		public: virtual property Button^ Mute {Button^ get();}
		public: virtual property Button^ Calculator {Button^ get();}
		public: virtual property Button^ SYSRQ {Button^ get();}
		#pragma endregion
		
		#pragma region Contructors
		public: Keyboard(DisposableI^ parent);
		public: ~Keyboard();
		private: void null();
		#pragma endregion
		
		#pragma region Functions
		public: virtual void Update();
		#pragma endregion
	};
}
}
}